<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // https://blog.csdn.net/weixin_41636483/article/details/130831174

    /*
        一、什么是JavaScript垃圾回收机制
        在JavaScript中，垃圾回收（Garbage Collection）是一种自动内存管理机制，它可以自动地识别不再使用的变量和对象并将它们从内存中清除，以释放内存空间。

        JavaScript中的垃圾回收器会定期扫描内存中的对象，标记那些可达对象和不可达对象。

        可达对象指的是当前代码中正在被使用的对象
        不可达对象指的是已经不再被引用的对象。
        垃圾回收器会将不可达对象标记为垃圾对象，并将它们从内存中清除。

        JavaScript中的垃圾回收机制主要有两种：

        标记清除（Mark-and-Sweep）和引用计数（Reference Counting）。
        标记清除是JavaScript中主流的垃圾回收算法，而引用计数则已经很少被使用。

        标记清除（Mark-and-Sweep）的工作原理是：垃圾回收器会定期扫描内存中的对象，从根对象开始遍历内存中的所有对象，对于可达对象，通过标记它们来标识它们是可达对象；对于未被标记的对象，就说明它们是不可达对象，需要被清除。该算法的优点是可以处理循环引用的情况，但在执行时间上可能会比较长，影响程序的性能。


        引用计数（Reference Counting）的工作原理是：垃圾回收器会记录每个对象被引用的次数，当对象被引用的次数为0时，就将该对象清除。该算法的优点是实现较为简单，但无法处理循环引用的情况，可能会导致内存泄漏。
    
    */

    // 标记清除

    var arr = [1, 2, 3];

    arr = null;

    function fn() {
        var a = 10;  // 11
        return function () {
            a++;
            console.log(a);
            return a;
        }
    }

    var newFn = fn();
    console.log(newFn);
    newFn = null;


    // 引用计数
    // 引用计数（Reference Counting）的工作原理是：垃圾回收器会记录每个对象被引用的次数，当对象被引用的次数为0时，就将该对象清除。该算法的优点是实现较为简单，但无法处理循环引用的情况，可能会导致内存泄漏。


    var arr = [1, 2, 3]; // 1
    var brr = arr;  // 2

    arr = null; // 1
    brr = null; // 0
</script>

</html>